//package org.jeecg.modules.zhima.portal.config.shiro;
//
//import org.jeecg.config.shiro.filters.JwtFilter;
//import org.jeecg.modules.zhima.portal.service.IUserService;
//import org.jeecg.modules.zhima.portal.service.impl.UserServiceImpl;
//import org.jeecg.modules.zhima.portal.util.JwtTokenUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
//import org.apache.shiro.mgt.DefaultSubjectDAO;
//import org.apache.shiro.mgt.SecurityManager;
//import org.apache.shiro.spring.LifecycleBeanPostProcessor;
//import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
//import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
//import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
//import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
//import org.crazycake.shiro.IRedisManager;
//import org.crazycake.shiro.RedisCacheManager;
//import org.crazycake.shiro.RedisClusterManager;
//import org.crazycake.shiro.RedisManager;
//import org.jeecg.common.util.oConvertUtils;
//import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.DependsOn;
//import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
//import org.springframework.util.StringUtils;
//import redis.clients.jedis.HostAndPort;
//import redis.clients.jedis.JedisCluster;
//
//
//import javax.annotation.Resource;
//import javax.servlet.Filter;
//
//import java.util.*;
//
///**
// * shiro配置类
// */
//@Slf4j
//@Configuration
//public class ShiroConfig {
//    @Value("${jeecg.shiro.excludeUrls}")
//    private String excludeUrls;
//    @Resource
//    LettuceConnectionFactory lettuceConnectionFactory;
////    @Autowired
////    private JwtTokenFilter jwtTokenFilter;
////    @Autowired
////    private JwtAuthFilter jwtAuthFilter;
//
//    /**
//     * Filter Chain定义说明
//     *
//     * 1、一个URL可以配置多个Filter，使用逗号分隔
//     * 2、当设置多个过滤器时，全部验证通过，才视为通过
//     * 3、部分过滤器可指定参数，如perms，roles
//     */
//    @Bean("shiroFilter")
//    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
//        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//        shiroFilterFactoryBean.setSecurityManager(securityManager);
//        // 拦截器
////        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
//        DefaultShiroFilterChainDefinition filterChainDefinitionMap = new DefaultShiroFilterChainDefinition();
//        if(oConvertUtils.isNotEmpty(excludeUrls)){
//            String[] permissionUrl = excludeUrls.split(",");
//            for(String url : permissionUrl){
//                filterChainDefinitionMap.addPathDefinition(url,"anon");
//            }
//        }
//
////        filterChainDefinitionMap.addPathDefinition("/api/**", "anon");
//
//        // 添加自己的过滤器并且取名为jwt
//        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
////        filterMap.put("jwt-token", new JwtTokenFilter());
////        filterMap.put("jwt-auth", jwtAuthFilter);
////        filterMap.put("jwt-token", jwtTokenFilter);
////        filterMap.put("jwt-auth", new JwtAuthFilter(jwtTokenUtil() , userService()));
//        shiroFilterFactoryBean.setFilters(filterMap);
//        // <!-- 过滤链定义，从上向下顺序执行，一般将/**放在最为下边
//
//
////        filterChainDefinitionMap.addPathDefinition("/api/**", "anon");
////        filterChainDefinitionMap.addPathDefinition("/user/**", "anon");
////        filterChainDefinitionMap.addPathDefinition("/user/login", "anon");
////        filterChainDefinitionMap.addPathDefinition("/api/user/login", "anon");
//////        filterChainDefinitionMap.addPathDefinition("/game/**", "anon");
////        filterChainDefinitionMap.addPathDefinition("/ranking/**", "anon");
////        filterChainDefinitionMap.addPathDefinition("/index/index", "anon");
//
////        filterChainDefinitionMap.addPathDefinition("/**", "jwt-auth");
////        filterChainDefinitionMap.addPathDefinition("/**", "jwt-token");
//
//        // 未授权界面返回JSON
//        shiroFilterFactoryBean.setUnauthorizedUrl("/sys/common/403");
//        shiroFilterFactoryBean.setLoginUrl("/sys/common/403");
//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap.getFilterChainMap());
//        return shiroFilterFactoryBean;
//    }
//
//    @Bean("securityManager")
//    public SecurityManager securityManager(ShiroRealm myRealm) {
//        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//        securityManager.setRealm(myRealm);
//
//        /*
//         * 关闭shiro自带的session，详情见文档
//         * http://shiro.apache.org/session-management.html#SessionManagement-
//         * StatelessApplications%28Sessionless%29
//         */
//        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
//        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
//        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
//        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
//        securityManager.setSubjectDAO(subjectDAO);
//        //自定义缓存实现,使用redis
//        securityManager.setCacheManager(redisCacheManager());
//        return securityManager;
//    }
//
//    /**
//     * 下面的代码是添加注解支持
//     * @return
//     */
//    @Bean
//    @DependsOn("lifecycleBeanPostProcessor")
//    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
//        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
//        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
//        /**
//         * 解决重复代理问题 github#994
//         * 添加前缀判断 不匹配 任何Advisor
//         */
//        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
//        defaultAdvisorAutoProxyCreator.setAdvisorBeanNamePrefix("_no_advisor");
//        return defaultAdvisorAutoProxyCreator;
//    }
//
//    @Bean
//    public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
//        return new LifecycleBeanPostProcessor();
//    }
//
//    @Bean
//    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
//        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
//        advisor.setSecurityManager(securityManager);
//        return advisor;
//    }
//
//    /**
//     * cacheManager 缓存 redis实现
//     * 使用的是shiro-redis开源插件
//     *
//     * @return
//     */
//    public RedisCacheManager redisCacheManager() {
//        log.info("===============(1)创建缓存管理器RedisCacheManager");
//        RedisCacheManager redisCacheManager = new RedisCacheManager();
//        redisCacheManager.setRedisManager(redisManager());
//        //redis中针对不同用户缓存(此处的id需要对应user实体中的id字段,用于唯一标识)
//        redisCacheManager.setPrincipalIdFieldName("id");
//        //用户权限信息缓存时间
//        redisCacheManager.setExpire(200000);
//        return redisCacheManager;
//    }
//
//    /**
//     * 配置shiro redisManager
//     * 使用的是shiro-redis开源插件
//     *
//     * @return
//     */
//    @Bean
//    public IRedisManager redisManager() {
//        log.info("===============(2)创建RedisManager,连接Redis..");
//        IRedisManager manager;
//        // redis 单机支持，在集群为空，或者集群无机器时候使用 add by jzyadmin@163.com
//        if (lettuceConnectionFactory.getClusterConfiguration() == null || lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().isEmpty()) {
//            RedisManager redisManager = new RedisManager();
//            redisManager.setHost(lettuceConnectionFactory.getHostName());
//            redisManager.setPort(lettuceConnectionFactory.getPort());
//            redisManager.setTimeout(0);
//            if (!StringUtils.isEmpty(lettuceConnectionFactory.getPassword())) {
//                redisManager.setPassword(lettuceConnectionFactory.getPassword());
//            }
//            manager = redisManager;
//        }else{
//            // redis 集群支持，优先使用集群配置	add by jzyadmin@163.com
//            RedisClusterManager redisManager = new RedisClusterManager();
//            Set<HostAndPort> portSet = new HashSet<>();
//            lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().forEach(node -> portSet.add(new HostAndPort(node.getHost() , node.getPort())));
//            JedisCluster jedisCluster = new JedisCluster(portSet);
//            redisManager.setJedisCluster(jedisCluster);
//            manager = redisManager;
//        }
//        return manager;
//    }
//
//    @Bean
//    public JwtTokenUtil jwtTokenUtil() {
//        return new JwtTokenUtil();
//    }
//
//    @Bean
//    public IUserService userService() {
//        return new UserServiceImpl();
//    }
//}
